Software development is a complex task. Typically, requirements are obtained, and software is developed to meet the requirements. To increase efficiency, programmers frequently re-use code from previous projects or from libraries to avoid having to re-write significant portions of the software.
However, re-using software in such a manner can be complicated. In practice, programmers often find pieces of software from various projects and libraries that need to be stitched together to work. Such integration takes time and may introduce errors in the software, thereby reducing efficiency and causing issues with reliability.
Accordingly, there is still a need to address the complexities of software development.